package com.thz.common.constants;

/**
 * 视频转换相关常量
 * 
 * @author THZ
 * @date 2025
 */
public class ConversionConstants {
    
    /**
     * 支持的视频格式（用于前端显示）
     */
    public static final String SUPPORTED_FORMATS = "MP4, AVI, MOV, WMV, FLV, MKV, WEBM, M4V, MPEG, MPG";
    
    /**
     * 最大文件大小（字节）
     */
    public static final long MAX_FILE_SIZE = 100 * 1024 * 1024;
    
    /**
     * 服务器资源受限环境下的保护阈值（2C4G 推荐）
     */
    public static final int SERVER_MAX_FPS = 15;               // 限制最大帧率，避免CPU占满
    public static final int SERVER_DEFAULT_MAX_WIDTH = 720;     // 限制默认最大宽度（未指定尺寸时）
    public static final int SERVER_DEFAULT_MAX_HEIGHT = 720;    // 限制默认最大高度（未指定尺寸时）
    public static final double SERVER_MAX_DURATION_SEC = 12.0;  // 限制最大转换时长，避免长视频拖垮服务器
    
    /**
     * 帧率相关常量
     */
    public static final int FPS_MIN = 1;
    public static final int FPS_MAX = 30;
    public static final int FPS_DEFAULT = 10;
    
    /**
     * 质量相关常量
     */
    public static final int QUALITY_MIN = 1;
    public static final int QUALITY_MAX = 100;
    public static final int QUALITY_DEFAULT = 80;
    
    /**
     * 校验并修正帧率参数
     * 
     * @param fps 输入的帧率
     * @return 修正后的帧率（1-30之间的整数）
     */
    public static int validateFps(Integer fps) {
        if (fps == null) {
            return FPS_DEFAULT;
        }
        return Math.max(FPS_MIN, Math.min(FPS_MAX, fps));
    }
    
    /**
     * 校验并修正质量参数
     * 
     * @param quality 输入的质量
     * @return 修正后的质量（1-100之间的整数）
     */
    public static int validateQuality(Integer quality) {
        if (quality == null) {
            return QUALITY_DEFAULT;
        }
        return Math.max(QUALITY_MIN, Math.min(QUALITY_MAX, quality));
    }
    
    /**
     * 针对服务器的保护性限制：将fps限制在服务器允许的上限
     */
    public static int clampFpsForServer(Integer fps) {
        int v = validateFps(fps);
        return Math.min(v, SERVER_MAX_FPS);
    }
    
    /**
     * 针对服务器的保护性限制：将duration限制在服务器允许的上限
     */
    public static Double clampDurationForServer(Double durationSec) {
        if (durationSec == null || durationSec <= 0) {
            return null;
        }
        return Math.min(durationSec, SERVER_MAX_DURATION_SEC);
    }
    
    private ConversionConstants() {
        // 工具类，禁止实例化
    }
}

